package collection

import (
	"sync"
	"sync/atomic"
)

// StateMutex 有状态的锁，用于支持带锁/不带锁的数据结构
type StateMutex struct {
	state *atomic.Bool
	mu    *sync.Mutex
}

// NewStateMutex 有状态的锁，用于支持带锁/不带锁的数据结构
func NewStateMutex() *StateMutex {
	return &StateMutex{state: new(atomic.Bool), mu: new(sync.Mutex)}
}

func (s *StateMutex) State() bool {
	return s.state.Load()
}
func (s *StateMutex) Lock() {
	if s.state.CompareAndSwap(false, true) {
		s.mu.Lock()
	}
}
func (s *StateMutex) Unlock() {
	if s.state.CompareAndSwap(true, false) {
		s.mu.Unlock()
	}
}
